package com.wct.sequoiadb;

import java.util.ArrayList;

import com.sequoiadb.base.SequoiadbDatasource;
import com.sequoiadb.base.SequoiadbOption;
import com.sequoiadb.net.ConfigOptions;
import com.wct.config.DBConfig;

public class SequoiadbDatasourceFactory
{
    private DBConfig dbConfig;
    
    public SequoiadbDatasourceFactory(DBConfig dbConfig)
    {
        this.dbConfig = dbConfig;
    }
    
    private SequoiadbDatasource ds;
    
    public SequoiadbDatasource getInstance()
    {
        if (ds == null)
        {
            ConfigOptions nwOpt = new ConfigOptions(); // 定义连接选项
            nwOpt.setConnectTimeout(500); // 设置若连接失败，超时时间（ms）
            nwOpt.setMaxAutoConnectRetryTime(0); // 设置若连接失败，重试次数
            
            SequoiadbOption dsOpt = new SequoiadbOption(); // 定义连接池选项
            // 以下设置的都是 SequoiadbOption 的默认值
            dsOpt.setMaxConnectionNum(1); // 设置连接池最大连接数
            dsOpt.setInitConnectionNum(1); // 初始化连接池时，创建连接的数量
            dsOpt.setDeltaIncCount(1); // 当池中没有可用连接时，增加连接的数量
            dsOpt.setMaxIdeNum(1); // 周期清理多余的空闲连接时，应保留连接的数量
            dsOpt.setTimeout(5 * 1000); // 当已使用的连接数到达设置的最大连接数时（500），请求连接的等待时间。
            dsOpt.setAbandonTime(10 * 60 * 1000); // 连接存活时间，当连接空闲时间超过连接存活时间，将被连接池丢弃
            dsOpt.setRecheckCyclePeriod(1 * 60 * 1000); // 清除多余空闲连接的周期
            dsOpt.setRecaptureConnPeriod(10 * 60 * 1000); // 检测并取回异常地址的周期
            
            ArrayList<String> urls = new ArrayList<String>();
            urls.add(dbConfig.getHost() + ":" + dbConfig.getPort());
            ds = new SequoiadbDatasource(urls, dbConfig.getUsername(), dbConfig.getPassword(), nwOpt, dsOpt); // 创建连接池
        }
        return ds;
    }
    
}
